package com.zkjl.protect_business.service;

import com.zkjl.protect_business.dto.document.UploadDocumentDTO;
import com.zkjl.protect_business.entity.Business;
import com.zkjl.protect_business.vo.statistic.GroupVO;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * 文档服务类
 */
public interface DocumentService {

    /**
     * 保存文档
     * @param file
     * @param templateId
     * @return
     * @throws IOException
     */
    Object saveDocument(MultipartFile file, String templateId, UploadDocumentDTO uploadDocumentDTO) throws IOException;


    /**
     * 根据id获取文档详情
     *
     * @param id
     * @return
     */
    Object get(String id, String businessId);

    Object get(IndexCoordinates indexCoordinates, String key, Object value);


    /**
     * 修改文档
     *
     * @param param
     * @return
     */
    Object saveOrupdate(String businessId, Map<String, Object> param);


    /**
     * 恢复索引数据
     * @param indexName
     * @return
     */
    Boolean recovery(String indexName);


    /**
     * 更新历史数据
     */
    void updateHistoricalData(String businessId);

    /**
     * 处理单个数据
     * @param content
     * @param business
     * @param index
     */
    void processData(Map<String, Object> content, Business business, IndexCoordinates index);



    /**
     * 获取业务下所有文档
     *
     * @param businessId
     * @return
     */
    PageImpl<Object> page(String businessId, Map<String, Object> param);


    /**
     * 获取数据集合
     *
     * @param param
     * @return
     */
    List<Map<String, Object> > list(Map<String, Object> param, String indexName);



    /**
     * 导出文档
     * @param templateId
     * @param param
     */
    String export(String templateId, Map<String, Object> param) throws IOException;

    /**
     * 删除文档
     *
     * @param id
     * @return
     */
    String del(String id, List<String> documentIds);


    /**
     * 根据地区获取单位文档数量
     * @param region
     * @return
     */
    List<GroupVO> getGroupVOByRegion(String region);


    /**
     * 根据索引获取时间分组
     * @param indexName
     * @return
     */
    List<GroupVO> getGroupByIndex(String indexName,Long startTime, Long endTime);


    /**
     * 根据索引获取指定时间分组 如果没有指定就默认使用创建时间
     * @param businessId
     * @return
     */
    List<GroupVO> getSpecifiedGroupByIndex(String businessId,Long startTime, Long endTime);


    /**
     * 根据索引获取指定时间分组 如果没有指定就默认使用创建时间
     *
     * @param businessId
     * @return
     */
    List<GroupVO> getSpecifiedGroupByIndex(String businessId, Long startTime, Long endTime, String orgName,String timeType);


    /**
     * 获取机构下的所有文档数量
     * @return
     */
    Long getCountBYOrgId(String orgName);

    /**
     * 获取业务下指定单位的所有文档数量
     *
     * @param orgName
     * @param businessId
     * @return
     */
    Long getCountByOrgIds(String orgName, String businessId, Long startTime, Long endTime);


    /**
     * 获取指定单位下级单位的所有文档统计信息
     *
     * @param orgId
     * @return
     */
    List<GroupVO> listChildrenGroup(String businessId, String orgId, Long startTime, Long endTime);


    /**
     * 获取机构下的所有文档数量
     *
     * @param orgId
     * @param startTime
     * @param endTime
     * @param indexName 索引中文组合名称
     * @return
     */
    Long getCountBYOrgId(String orgId, Long startTime, Long endTime, String indexName);


    /**
     * 批量上传文档附件，文件名中必须包含身份证号
     *
     * @param files
     */
    void uploadAttachment(MultipartFile[] files, String businessId, String field);


    /**
     * 根据唯一标识获取所有文档
     *
     * @param index
     * @return
     */
    List<Object> findAllParam(String key, String vaule, IndexCoordinates index);

    /**
     * 修改文档数据
     * @param id
     * @param param
     * @return
     */
    Object updateById(String id, Map<String,Object> param, IndexCoordinates index);


}
